﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpPickInterface.h"
#include "ContainerUtil.h"
#include "IObject.h"

namespace gcmp
{
    class IDocument;
    class ISelectionChangeEvent;

    /// \brief 选择集，为单例对象，全局唯一
    ///
    /// 当前被选择到的对象均存于此选择集中
    class GCMP_PICK_INTERFACE_EXPORT ISelection : public IObject
    {
        DEFINE_CAST_DERIVED(ISelection, IObject);
    public:
        
        /// \brief 获得选择集
        /// \return 选择集指针
        static ISelection* Get();

        /// \brief 初始化选择集
        ///
        /// 调用时机：切换文档时
        /// 所做操作：重置文档+清空选择集内容
        /// \param pDocument 当前文档信息
        /// \return void
        virtual void Init(IDocument* pDocument) = 0;

        /// \brief 清除选择集中内容
        /// \param pDocument 被清除的图形节点引用所属文档
        /// \return 成功返回true，失败返回false
        virtual bool Clear(IDocument *pDocument) = 0;

        /// \brief 判断选择集是否为空
        /// \return 返回true表示为空，false表示不为空
        virtual bool IsEmpty() const = 0;

        /// \brief 获得选择集中图形节点数量
        /// \return 选择集中图形节点数量
        virtual Int64 GetCount() const = 0;

        /// \brief 向选择集中添加图形节点引用
        /// \param pDocument 被添加的图形节点引用所属文档
        /// \param graphicsNodeReference 被添加的图形节点引用
        /// \return 成功返回true，失败返回false
        virtual bool AddGraphicsNodeReference(IDocument* pDocument, const IGraphicsNodeReference& graphicsNodeReference) = 0;


        /// \brief 从选择集中删除图形节点引用
        /// \param pDocument 被删除的图形节点引用所属文档
        /// \param graphicsNodeReference 被删除的图形节点引用
        /// \return 成功返回true，失败返回false
        virtual bool DeleteGraphicsNodeReference(IDocument* pDocument, const IGraphicsNodeReference& graphicsNodeReference) = 0;
    

        /// \brief 获得选择集中所有的图形节点引用
        /// \return 图形节点引用集合
        virtual const std::set<OwnerPtr<IGraphicsNodeReference>, OwnerPtrContainerUtil::LessPredicate<IGraphicsNodeReference>>& GetGraphicsNodeReferences() const = 0;

        virtual const std::unordered_set<ElementId, ElementIdHash> &GetSelectedElements() = 0;

        /// \brief 获得选择集中元素所属文档
        /// \return 选择集中元素所属文档
        virtual const IDocument* GetDocument() const = 0;

        /// \brief 获得选择集发生改变通知事件
        /// \return 选择集发生改变通知事件
        virtual ISelectionChangeEvent* GetSelectionChangeEvent() const = 0;


        /// \brief 向选择集中添加图形节点引用
        /// \param pDocument   被添加的图形节点引用所属文档
        /// \param graphicsNodeReferences  被添加的图形节点引用
        /// \return   成功返回true，失败返回false
        virtual bool AddGroupGraphicsNodeReference(IDocument* pDocument, const GraphicsNodeReferenceOwnerPtrSet& graphicsNodeReferences) = 0;

        /// \brief 从选择集中删除图形节点引用
        /// \param pDocument 被删除的图形节点引用所属文档
        /// \param graphicsNodeReference 被删除的图形节点引用
        /// \return 成功返回true，失败返回false
        virtual bool DeleteGroupGraphicsNodeReference(IDocument* pDocument, const GraphicsNodeReferenceOwnerPtrSet& graphicsNodeReferences) = 0;

        /// \brief 替换选择集中图形节点引用
        /// \param pDocument   被替换的图形节点引用所属文档
        /// \param graphicsNodeReferences  被替换的图形节点引用
        /// \return   成功返回true，失败返回false
        virtual bool ReplaceGroupGraphicsNodeReference(IDocument* pDocument, const GraphicsNodeReferenceOwnerPtrSet& graphicsNodeReferences) = 0;

        /// \brief 反转选择集中图形节点引用
        /// \param pDocument   被反转的图形节点引用所属文档
        /// \param graphicsNodeReferences  被反转的图形节点引用
        /// \return   成功返回true，失败返回false
        virtual bool RevertGroupGraphicsNodeReference(IDocument* pDoc, const gcmp::GraphicsNodeReferenceOwnerPtrSet& graphicsNodeReferences) = 0;

        /// \brief 设置平台的框选线条是否启用智能色
        /// \param isSelectRectSmartColor 框选线条是否启用智能色
        /// \return void
        virtual void SetSelectRectSmartColor(bool isSelectRectSmartColor) = 0;

        /// \brief 设置平台的框选线条是否启用智能色
        /// \param isSelectRectSmartColor 框选线条是否启用智能色
        /// \return bool true 框选线条启用智能色 false 框选线条不用智能色
        virtual bool GetSelectRectSmartColor() = 0;

    };
}



